/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * main.c
 * Copyright (C) Victor Maida 2013 <vmaida@gmail.com>
 * 
 * iban is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * iban is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
/* Este programa calcula o iban de contas em bancos brasileiros
 * com base nas informações fornecidas pelo usuário (banco,
 * agência, número da conta, tipo de conta, ordem de titularidade).
 */

/*Formação do IBAN - BR2!n8!n5!n10!n1!a1!c
	 * 
	 * Quantidade total de caracteres: 29
	 * 
	 * 2 caracteres alfanuméricos correspondentes ao código do País
	 * conforme norma ISO 3166-1;
	 * 
	 * 2 dígitos verificadores (mod 97) conforme norma ISO 7064
	 * (faixa de 02 a 98);
	 *
	 * 8 caracteres numéricos correspondentes ao identificador da
	 * instituição financeira – ISPB, conforme lista de participantes
	 * do STR divulgada no sítio do Bacen;
	 * 
	 * 5 caracteres numéricos correspondentes à identificação da agência
	 * bancária (sem dígito verificador);
	 *
	 * 10 caracteres numéricos correspondentes ao número de conta do 
	 * cliente (com dígito verificador);
	 * 
	 * 1 caractere alfanumérico correspondente ao tipo conta, conforme
	 * dicionário de tipos do Catálogo de Mensagens e de Arquivos do SFN;
	 * 
	 * 1 caractere alfanumérico correspondente à identificação do titular
	 * da conta, de acordo com a ordem na listagem de titulares, sendo “1”
	 * para o primeiro ou único titular, “2” para o segundo titular, “A’ 
	 * para o décimo titular, e assim por diante, utilizando os caracteres
	 * alfabéticos de “A” a “Z” (incluindo “K”, “Y” e “W”) para os titulares
	 * a partir do décimo.
	 */

/* Requisitos suplementares
	 * 
	 * Caracteres maiúsculos: Embora o texto da norma ISO 13616 permita a
	 * utilização de caracteres maiúsculos e minúsculos, devem ser utilizados
	 * pelas instituições brasileiras na indicação do IBAN de seus clientes
	 * apenas caracteres maiúsculos, não devendo os sistemas de validação
	 * fazer diferenciação entre caracteres maiúsculos e minúsculos nas
	 * mensagens, transferências ou ordens recebidas, de modo que não sejam
	 * rejeitados os identificadores exclusivamente por esse critério.
	 * 
	 * Comprimento fixo total e por componente: Embora o texto da norma
	 * ISO 13616 permita o comprimento variável do identificador, para as
	 * instituições brasileiras, o IBAN deverá possuir a quantidade de
	 * caracteres fixa, assim como cada um de seus componentes, devendo ser
	 * acrescentados zeros à esquerda para os componentes em que for
	 * necessário.
	 * 
	 * Identificador bancário: O identificador bancário a ser utilizado
	 * será o ISPB, divulgado pelo Banco Central do Brasil em seu sítio
	 * no internet.
	 * 
	 * Formato impresso: Com vistas a facilitar a automação e a leitura
	 * eletrônica e manual de documentos impressos, quando em papel, o
	 * IBAN deverá ser formatado em grupos de quatro caracteres separados
	 *por espaço.
 */

	char pais[2] = "BR";
	char paisnumero[4] = 1127; // B=11 R=27
	char digverificador[2];
	char verificador[2] = "00"; //Inicialmente deve valer 00
	char banco[8];
	char agencia[5];
	char conta[10];
	char tpconta;
	char tpcontanumero[2];
	char titularidadeentrada[2];
	char titularidadefinal // 1 a 9, A a Z
	int intcalcdigverificador;

/* Pede ao usuário que escolha o banco em uma lista e atribui para
	 * a variavel banco o respectivo ISPB
	 * 
"Número","Nome","ISPB"
"117","Advanced Corretora de Câmbio Ltda.","92856905"
"123","Agiplan Financeira S.A. - Crédito, Financiamento e Investimento","13660104"
"654","Banco A. J. Renner S.A.","92874270"
"246","Banco ABC Brasil S.A.","28195667"
"025","Banco Alfa S.A.","03323840"
"641","Banco Alvorada S.A.","33870163"
"213","Banco Arbi S.A.","54403563"
"019","Banco Azteca do Brasil S.A.","09391857"
"024","Banco Bandepe S.A.","10866788"
"740","Banco Barclays S.A.","61146577"
"107","Banco BBM S.A.","15114366"
"122","Banco BERJ S.A.","33147315"
"739","Banco BGN S.A.","00558456"
"096","Banco BMFBovespa de Serviços de Liquidação e Custódia S/A","00997185"
"318","Banco BMG S.A.","61186680"
"752","Banco BNP Paribas Brasil S.A.","01522368"
"248","Banco Boavista Interatlântico S.A.","33485541"
"218","Banco Bonsucesso S.A.","71027866"
"065","Banco Bracce S.A.","48795256"
"063","Banco Bradescard S.A.","04184779"
"036","Banco Bradesco BBI S.A.","06271464"
"204","Banco Bradesco Cartões S.A.","59438325"
"394","Banco Bradesco Financiamentos S.A.","07207996"
"237","Banco Bradesco S.A.","60746948"
"208","Banco BTG Pactual S.A.","30306294"
"263","Banco Cacique S. A.","33349358"
"473","Banco Caixa Geral - Brasil S.A.","33466988"
"412","Banco Capital S. A.","15173776"
"040","Banco Cargill S.A.","03609817"
"266","Banco Cédula S.A.","33132044"
"233","Banco Cifra S.A.","62421979"
"745","Banco Citibank S.A.","33479023"
"241","Banco Clássico S.A.","31597552"
"095","Banco Confidence de Câmbio S.A.","11703662"
"756","Banco Cooperativo do Brasil S/A - Bancoob","02038232"
"748","Banco Cooperativo Sicredi S. A.","01181521"
"075","Banco CR2 SA","03532415"
"222","Banco Credit Agrícole Brasil S.A.","75647891"
"505","Banco Credit Suisse (Brasil) S.A.","32062580"
"003","Banco da Amazônia S.A.","04902979"
"083","Banco da China Brasil S.A.","10690848"
"707","Banco Daycoval S.A.","62232889"
"070","Banco de Brasília S.A.","00000208"
"300","Banco de la Nacion Argentina","33042151"
"495","Banco de La Provincia de Buenos Aires","44189447"
"494","Banco de La Republica Oriental del Uruguay","51938876"
"456","Banco de Tokyo-Mitsubishi UFJ Brasil S.A.","60498557"
"214","Banco Dibens S.A.","61199881"
"001","Banco do Brasil S.A.","00000000"
"047","Banco do Estado de Sergipe S.A.","13009717"
"037","Banco do Estado do Pará S.A.","04913711"
"041","Banco do Estado do Rio Grande do Sul S.A.","92702067"
"004","Banco do Nordeste do Brasil S.A.","07237373"
"265","Banco Fator S.A.","33644196"
"224","Banco Fibra S.A.","58616418"
"626","Banco Ficsa S. A.","61348538"
"121","Banco Gerador S.A.","10664513"
"612","Banco Guanabara S.A.","31880826"
"604","Banco Industrial do Brasil S.A.","31895683"
"320","Banco Industrial e Comercial S. A.","07450604"
"653","Banco Indusval S. A.","61024352"
"630","Banco Intercap S.A.","58497702"
"077","Banco Intermedium S.A.","00416968"
"249","Banco Investcred Unibanco S.A.","61182408"
"184","Banco Itaú BBA S.A.","17298092"
"029","Banco Itaú BMG Consignado S.A.","33885724"
"479","Banco ItauBank S.A.","60394079"
"376","Banco J. P. Morgan S. A.","33172537"
"074","Banco J. Safra S.A.","03017677"
"217","Banco John Deere S.A.","91884981"
"076","Banco KDB do Brasil S.A.","07656500"
"757","Banco Keb do Brasil S. A.","02318507"
"600","Banco Luso Brasileiro S.A.","59118133"
"072","Banco Mais S.A.","33074683"
"243","Banco Máxima S.A.","33923798"
"389","Banco Mercantil do Brasil S.A.","17184037"
"746","Banco Modal S.A.","30723886"
"066","Banco Morgan Stanley S. A.","02801938"
"079","Banco Original do Agronegócio S.A.","09516419"
"212","Banco Original S.A.","92894922"
"623","Banco Panamericano S.A.","59285411"
"611","Banco Paulista S.A.","61820817"
"613","Banco Pecúnia S. A.","60850229"
"094","Banco Petra S.A.","11758741"
"643","Banco Pine S.A.","62144175"
"735","Banco Pottencial S.A.","00253448"
"747","Banco Rabobank International Brasil S.A.","01023570"
"088","Banco Randon S.A.","11476673"
"633","Banco Rendimento S.A.","68900810"
"741","Banco Ribeirão Preto S.A.","00517645"
"120","Banco Rodobens SA","33603457"
"453","Banco Rural S.A.","33124959"
"422","Banco Safra S.A.","58160789"
"033","Banco Santander (Brasil) S. A.","90400888"
"743","Banco Semear S.A.","00795423"
"749","Banco Simples S.A.","10995587"
"366","Banco Société Générale Brasil S.A.","61533584"
"637","Banco Sofisa S. A.","60889128"
"012","Banco Standard de Investimentos S.A.","04866275"
"464","Banco Sumitomo Mitsui Brasileiro S.A.","60518222"
"082","Banco Topazio S.A.","07679404"
"634","Banco Triângulo S.A.","17351180"
"655","Banco Votorantim S.A.","59588111"
"610","Banco VR S.A.","78626983"
"119","Banco Western Union do Brasil SA","13720915"
"370","Banco WestLB do Brasil S.A.","61088183"
"124","Banco Woori Bank do Brasil S.A.","15357060"
"021","Banestes S.A. Banco do Estado do Espírito Santo","28127603"
"719","Banif - Bco Internacional do Funchal (Brasil) S.A.","33884941"
"755","Bank of America Merrill Lynch Banco Múltiplo S.A.","62073200"
"081","BBN Banco Brasileiro de Negocios S.A.","10264663"
"250","BCV - Banco de Crédito e Varejo S/A","50585090"
"078","BES Investimento do Brasil S.A - Banco de Investimento","34111187"
"017","BNY Mellon Banco S.A.","42272526"
"069","BPN Brasil Banco Múltiplo S.A.","61033106"
"126","BR Partners Banco de Investimento S.A.","13220493"
"125","Brasil Plural S.A. Banco Múltiplo","45246410"
"092","Brickell S.A. Crédito, Financiamento e Investimento","12865507"
"080","BT Associados Corretora de Câmbio Ltda","73622748"
"104","Caixa Econômica Federal","00360305"
"112","Central das Cooperativas de Crédito do Brasil Central","04243780"
"114","Central das Cooperativas de Economia e Crédito Mútuo do Estado do Espírito Santo","05790149"
"091","Central de Cooperativas de Economia e Crédito Mútuo do Est RS - Unicred","01634601"
"477","Citibank N.A.","33042953"
"127","Codepe - Corretora de Valores S.A.","09512542"
"060","Confidence Corretora de Câmbio S.A.","04913129"
"090","Cooperativa Central de Crédito do Estado de São Paulo Ltda. - Unicred Central SP","73085573"
"097","Cooperativa Central de Crédito Noroeste Brasileiro Ltda - CentralCredi","04632856"
"085","Cooperativa Central de Crédito Urbano - Cecred","05463212"
"087","Cooperativa Central de Economia e Crédito Mútuo das Unicreds do Estado de SC Ltd","00543968"
"016","Cooperativa de Crédito Mútuo dos Despachantes de Trânsito de Santa Catarina","04715685"
"089","Cooperativa de Crédito Rural da Região da Mogiana","62109566"
"901","Corretora Souza Barros Câmbio e Títulos S.A.","61787776"
"098","Credialiança Cooperativa de Crédito Rural","78157146"
"010","Credicoamo Crédito Rural Cooperativa","81723108"
"011","Credit Suisse Hedging-Griffo Corretora de Valores S.A.","61809182"
"487","Deutsche Bank S.A. - Banco Alemão","62331228"
"103","EBS Capital Corretora de Câmbio S.A.","04068419"
"064","Goldman Sachs do Brasil Banco Múltiplo S. A.","04332281"
"062","Hipercard Banco Múltiplo S.A.","03012230"
"399","HSBC Bank Brasil S. A. - Banco Multiplo","01701201"
"492","ING Bank N.V.","49336860"
"652","Itaú Unibanco Holding S.A.","60872504"
"341","Itaú Unibanco S.A.","60701190"
"488","JPMorgan Chase Bank, National Association","46518205"
"105","Lecca Crédito, Financiamento e Investimento S/A","07652226"
"113","Magliano S.A. Corretora de Cambio e Valores Mobiliarios","61723847"
"014","Natixis Brasil S.A. Banco Múltiplo","09274232"
"753","NBC Bank Brasil S. A. - Banco Múltiplo","74828799"
"111","Oliveira Trust Distribuidora de Títulos e Valores Mobiliários S.A.","36113876"
"254","Parana Banco S. A.","14388334"
"100","Planner Corretora de Valores S.A.","00806535"
"093","Pólocred Sociedade de Crédito ao Microempreendedor e à Empresa de Pequeno Porte","07945233"
"108","PortoCred S.A. Crédito, Financiamento e Investimento","01800019"
"101","Renascença Distribuidora de Títulos e Valores Mobiliários Ltda.","62287735"
"751","Scotiabank Brasil S.A. Banco Múltiplo","29030467"
"013","Senso Corretora de Câmbio e Valores Mobiliários S.A.","17352220"
"118","Standard Chartered Bank (Brasil) S.A. Banco de Investimento","11932017"
"131","Tullett Prebon Brasil S.A. Corretora de Valores e Câmbio","61747085"
"015","UBS Brasil Corretora de Câmbio, Títulos e Valores Mobiliários S.A.","02819125"
"409","Unibanco-União de Bancos Brasileiros S.A.","33700394"
"230","Unicard Banco Múltiplo S.A","61071387"
"099","Uniprime Central – Central Interestadual de Cooperativas de Crédito Ltda.","03046391"
"084","Uniprime Norte do Paraná - Coop. de Econ e Crédito Mútuo dos Médicos,...","02398976"
"102","XP Investimentos Corretora de Câmbio Títulos e Valores Mobiliários S.A.","02332886"
	 * 
	 */


/* Pede ao usuário que digite o numero da agencia sem o digito
	 * verificador. Se o numero da agencia for menor que 5
	 * digitos, completar com zeros a esquerda
	 */

/* Pede ao usuário que digite o numero da conta com o digito
	 * verificador. Se o numero da conta for menor que 10
	 * digitos, completar com zeros a esquerda
	 */

/* Pede ao usuário que digite o tipo da conta. 'C' para conta
	 * corrente ou 'P' para conta poupança. Atribuir o número
	 * 12 para conta corrente ou 25 para conta poupança para
	 * fins de cálculo do digito verificador.
	 */

/* Pede ao usuário que indique a posição que ocupa na titularidade
	 * da conta. 1 caso seja o primeiro titular ou se for conta
	 * unica, 2 se for o segundo titular, 3 se for o terceiro titular,
	 * e assim por diante. Do decimo titular em diante usar 'A'
	 * para o decimo titular, 'B' para o decimo primeiro titular e assim
	 * por diante. Usar a seguinte tabela para substituição de caracteres
	 * para dígitos: A=10, B=11, C=12, D=13, E=14, F=15, G=16, H=17,
	 * I=18, J=19, K=20, L=21, M=22, N=23, O=24, P=25, Q=26, R=27, S=28,
	 * T=29, U=30, V=31, W=32, X=33, Y=34 e Z=35
	 */

/* Função para o calculo do digito verificador.
	 * Concatenar as variaveis, na seguinte ordem: banco, agencia, conta, 
	 * tpcontanumero, titularidade, paisnumero, verificador1 e verificador2.
	 * Converter a string em um numero inteiro, excluindo zeros a esquerda.
	 * Calcular o mod-97 deste número (int mod 97). O resultado subtrair
	 * de 98 (98 - resultado) e usar a resposta como o digito verificador.
	 * Se o resultado for um numero de 1 digito (< 10), colocar um zero a
	 * esquerda.
	 *
	 * Função fmod:
	 * 
	 * float fmod (float intcalcdigverificador, float 97);
	 *
	 * Calculates x modulo y, i.e. the remainder of x/y.
	 * fmod returns x modulo y, i.e. it returns the remainder f, where x = a * y + f for some
	 * integer a and 0 <= f < y. Where y = 0, fmod returns 0.
	 *
	 * digverificador = 98 - fmod
	 * 	if digverificador < 10 ; 0digiverificador
	 */

/* Exibir o IBAN
	 * pais digiverificador banco agencia conta tpconta titularidade
	 */

/*Gerar PDF
	* País:
	* Banco:
	* Agência:
	* Conta tipo:
	* Conta n.:
	* IBAN:
	*/
	
}
